"""逻辑回归这个算法的名称有一定的误导性。
虽然它的名称中有“回归”，当它在机器学习中不是回归算法，而是分类算法。
因为采用了与回归类似的思想来解决分类问题，所以它的名称才会是逻辑回归。
逻辑回归的思想可以追溯到19世纪，由英国统计学家Francis Galton在研究豌豆遗传问题时首次提出。
然而，真正将逻辑回归应用于机器学习的是加拿大统计学家Hugh Everett，他在1970年代提出了广义线性模型（GLM），其中包括逻辑回归。
逻辑回归广泛应用于各种分类问题，如垃圾邮件识别、疾病预测、市场细分等。
1. 算法概述
逻辑回归通过构建一个逻辑模型来预测分类结果。
它首先对特征进行线性回归，
y=w0x0+w1x1+w2x2+w3x3...+wnxn=wTx然后通过一个sigmoid函数（y=1/1+e−x）
将线性回归的结果转化为概率值，sigmoid函数的输出范围是0到1。最后得到逻辑回归的公式：hw(x)=1/1+e−y=1/1+e−wTx
2. 创建样本数据
这次用scikit-learn中的样本生成器make_moons来生成二分类用的样本数据。
"""
import numpy as np
from matplotlib import pyplot as plt
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import matplot_config

matplot_config.init_config()
fig, ax = plt.subplots(1, 1)
X, y = make_moons(noise=0.05, n_samples=1000)
ax.scatter(X[:, 0], X[:, 1], marker="o", c=y, s=25)

plt.show()

"""关于用make_moons生成样本数据的介绍，请参考：TODO

3. 模型训练
首先，分割训练集和测试集。
"""

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
"""这次按照8:2的比例来划分训练集和测试集。

然后用scikit-learn中的LogisticRegression模型来训练："""

# 定义逻辑回归模型
reg = LogisticRegression()

# 训练模型
reg.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = reg.predict(X_test)
"""LogisticRegression的主要参数包括：

penalty：广义线性模型的正则项，可选值包括L1正则项'l1'、L2正则项'l2'、复合正则'elasticnet'和无正则项None，默认值为'l2'。
dual：是否为对偶问题。默认为False。
tol：容忍度。默认值为0.0001。
C：惩罚系数。默认值为1.0。
fit_intercept：是否拟合截距。默认为True。
intercept_scaling：截距的缩放因子。默认值为1。
class_weight：样本权重，用于实现数据的不同分类重要性的惩罚。默认为None。
random_state：随机种子。默认为None。
solver：优化算法。默认为'warn'，可选项有'lbfgs'、'sag'、'saga'、'newton-cg'、'sag-l2'、'saga-l2'、'lbfgs-l2'和'optimal'。
max_iter：最大迭代次数。默认为100。
multi_class：多类别分类器。默认为'warn'，当n_classes>2时，默认为True，否则默认为False。
n_jobs：线程数。默认为None，表示使用CPU的核数。
最后验证模型的训练效果："""

# 比较测试集中有多少个分类预测正确
correct_pred = np.sum(y_pred == y_test)

print("预测正确率：{}%".format(correct_pred/len(y_pred)*100))

"""# 运行结果
预测正确率：89.0%
准确率还可以，可以调节生成样本数据的make_moons方法的noise参数，
看看在不同混乱程度的样本数据下，逻辑回归的准确性是否健壮。

4. 总结
逻辑回归在很多领域都有广泛的应用，如自然语言处理、图像识别、医疗诊断、信用评分等。
它尤其适用于那些样本特征之间存在线性关系，且目标变量为二元的情况。

逻辑回归算法主要优势在于：：

实现简单：易于理解和实现，可以在短时间内训练出模型。
计算效率高：在训练和预测时具有较高的计算效率，可以处理大规模的数据集。
可解释性强：可以给出概率输出，这使得它更容易解释和信任。
不过，逻辑回归也有其不足之处：

对数据质量和特征选择敏感：如果数据中存在噪音或者特征选择不当，可能会出现过拟合或者欠拟合的情况。
只能处理二分类问题：如果要处理多分类问题的话，需要把多分类问题转为多个二分类问题。
对异常值和缺失值敏感：处理不当可能会影响模型的性能。"""